package com.maben.security.util;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Component
public class RedisTokenUtils {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    // redis存储token的前缀
    private static final String tokenPrefix = "token:";
    // redis存储token的时长
    private static final long expireSeconds = 10;

    /**
     * 生成 Token 并存储到 Redis
     * @param username 用户名（关联Token与用户）
     * @return 生成的Token字符串
     */
    public String generateToken(String username) {
        // 1. 生成随机Token（UUID确保唯一性）
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        // 2. 存储到Redis：key=token:xxx，value=username，设置过期时间
        String redisKey = tokenPrefix + token;
        stringRedisTemplate.opsForValue().set(redisKey, username, expireSeconds, TimeUnit.SECONDS);
        return token;
    }

    /**
     * 验证 Token 有效性（从Redis查询）
     * @param token Token字符串
     * @return 有效返回用户名，无效返回null
     */
    public String validateToken(String token) {
        if (!StringUtils.hasText(token)) {
            return null;
        }
        String redisKey = tokenPrefix + token;
        // 查询Redis中是否存在该Token
        return stringRedisTemplate.opsForValue().get(redisKey);
    }

    /**
     * 动态续期 Token（延长Redis过期时间）
     * @param token Token字符串
     */
    public void renewToken(String token) {
        String redisKey = tokenPrefix + token;
        stringRedisTemplate.expire(redisKey, expireSeconds, TimeUnit.SECONDS);
    }

    /**
     * 登出（删除Redis中的Token）
     * @param token Token字符串
     */
    public void logout(String token) {
        String redisKey = tokenPrefix + token;
        stringRedisTemplate.delete(redisKey);
    }
}